/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package modelo;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import javax.swing.JOptionPane;

/**
 *
 * @author ThaísRamir
 */
public class AtuacaoDAO {
    
    
    
     private Connection conn;  //cria uma variável que receberá um objeto da classe Connection
     private Atuacao atuacao;
     private Statement st;
    /**
     * <p>Este é o método construtor da classe. Ao construir uma instância da classe ContatoFilmeDAO ele conectata a aplicação com o banco de dados. Para isso,
 ele chama o método getConnection da classe Conexão.<p>
     */
    public AtuacaoDAO(){
        if( (conn = new Conexao().getConnection())== null ){
            JOptionPane.showMessageDialog(null, "Não conectou o banco de dados.");
        }
    }
    
    /**
     * <p>Este método realiza a operação de INSERT no banco de dados. Ele recebe os dados armazenados em um objeto da classe Contato 
     * e os insere na tabela contatos.</p>
     * @param atuacao
     */
    public void inserir(Atuacao atuacao) {
        String sql = "INSERT INTO atua " +            //aqui estamos criando uma String com o comando SQL.
        "(papel)" +
        " VALUES (?)";
        try 
            (PreparedStatement pstmt = this.conn.prepareStatement(sql)) //utilizamos um objeto PreparedStatement para realizar a operação
        {
                pstmt.setString(1,atuacao.getPapel());   //chamamos o método apropriado do objeto PreparedStatement para copiar os dados do objeto contato
                 
                
                if(!pstmt.execute()){ //executa o INSERT
                    JOptionPane.showMessageDialog(null, "Atuação inserida com sucesso!");
                }
                
                pstmt.close();  //não podemos esquecer de liberar este recurso
                    
        } catch (SQLException ex){ //se a conexão falhar, emite a mensagem abaixo
            System.out.println("SQLException em adicionar!!!" + "Erro detectado: " + ex.getMessage());
        }
        //como utiliza try-with-resource o recurso stmt é fechado automaticamente
    }
    
    
    /**
     * <p>Este método realiza a operação de DELETE no banco de dados. Ele recebe a chave de um registro cadastrado no banco de dados e realiza a operação.</p>
     * @param id 
     */
  /*  public void excluir(int id){
        String sql = "DELETE FROM atua WHERE id = " + id;  //aqui estamos criando uma String com o comando SQL.
        try 
            (Statement stmt = this.conn.createStatement()) //utilizamos um objeto Statement para realizar a operação
        {
                if(stmt.executeUpdate(sql) == 1){ //executa o DELETE
                    JOptionPane.showMessageDialog(null, "Atuação excluída com sucesso!");
                }
                
                stmt.close();  //não podemos esquecer de liberar este recurso
                    
        } catch (SQLException ex) { //se a conexão falhar, emite a mensagem abaixo
            System.out.println("SQLException em excluir!!!" + "Erro detectado: " + ex.getMessage());
        }
        //como utiliza try-with-resource o recurso stmt é fechado automaticamente

    }
    
    /**
     * <p>Este método realiza a operação de UPDATE no banco de dados. Ele recebe os dados armazenados em um objeto da classe Contato 
     * e os altera na tabela contatos.</p>
     * @param atuacao 
     */
    public void alterar(Atuacao atuacao){
        String sql = "UPDATE atua SET " +         //aqui estamos criando uma String com o comando SQL.
                       "papel=?" +
                        "WHERE cod_atua=?";
        
       try
            (PreparedStatement pstmt = this.conn.prepareStatement(sql))  //utilizamos um objeto PreparedStatement para realizar a operação
        {
              pstmt.setString(1,atuacao.getPapel());   //chamamos o método apropriado do objeto PreparedStatement para preparar a execução do comando SQL
              pstmt.setInt(2, atuacao.getCod_atuacao());
            if(pstmt.executeUpdate() != 0){ //executa o UPDATE
                    JOptionPane.showMessageDialog(null, "Atuação alterado com sucesso.");
                }
                pstmt.close();  //não podemos esquecer de liberar este recurso
        }catch(SQLException ex){  //se a conexão falhar, emite a mensagem abaixo
         System.out.println("SQLException em alterar!!!" + "Erro detectado: " + ex.getMessage());
          
          //como utiliza try-with-resource o recurso stmt é fechado automaticamente
      }
        
    } 
    
    public void excluir(int cod_atuacao){
        String sql = "DELETE FROM atua WHERE cod_atua = " + cod_atuacao;  //aqui estamos criando uma String com o comando SQL.
        try 
            (Statement stmt = this.conn.createStatement()) //utilizamos um objeto Statement para realizar a operacao
        {
                if(stmt.executeUpdate(sql) == 1){ //executa o DELETE
                    JOptionPane.showMessageDialog(null, "Atuação exclu�do com sucesso!");
                }
                
                stmt.close();  //nao podemos esquecer de liberar este recurso
                    
        } catch (SQLException ex) { //se a conex�o falhar, emite a mensagem abaixo
            System.out.println("SQLException em excluir!!!" + "Erro detectado: " + ex.getMessage());
        }
        //como utiliza try-with-resource o recurso stmt � fechado automaticamente

    }
    
    /**
     * <p>Este método realiza a operação de SELECT no banco de dados. Ele recebe um texto (o nome de um contato) cadastrado no banco de dados, faz a
   //  * consulta e preenche um ArrayList com os dados consultados, para, logo após, retornar esse ArrayList. </p>
   //  * @param nome
   //  * @return ArrayList de objetos da classe Contato
   //  */
    
    /**
     * <p>Este método realiza a operação de SELECT no banco de dados. Ele recebe um texto (o nome de um contato) cadastrado no banco de dados, faz a
   //  * consulta e preenche um ArrayList com os dados consultados, para, logo após, retornar esse ArrayList. </p>
   //  * @param nome
   //  * @return ArrayList de objetos da classe Contato
   //
     * @return
     */

    /**
     * <p>Este método realiza a operação de SELECT no banco de dados. Ele recebe um texto (o nome de um contato) cadastrado no banco de dados, faz a
     * consulta e preenche um ArrayList com os dados consultados, para, logo após, retornar esse ArrayList. </p>
     * @param nome
    * @return ArrayList de objetos da classe Contato
   
     * @param nome
     * @return
     */
    public ArrayList<Atuacao> consultar(String papel){
        
        String sql = "SELECT * FROM atua WHERE papel " + "LIKE '" + papel + "%' ORDER BY papel";  //aqui estamos criando uma String com o comando SQL.
        ArrayList<Atuacao> atuacoes = new ArrayList<>(); //constrói um objeto da classe ArrayList, um array automaticamente dimensionável em tempo de execução
        Atuacao ator; //declara uma variável para receber um objeto da classe Contato
        
        try
            (Statement stmt = this.conn.createStatement(); //utilizamos um objeto Statement para realizar a operação
             ResultSet rs = stmt.executeQuery(sql);) //executamos o método executeQuery do objeto PreparedStatement no banco de dados e
                                                     //ele nos retorna um objeto ResultSet, com todos os dados retornados da consulta.
        {
            while (rs.next()) { //move o cursor para a próxima linha do ResultSet, varrendo todo o objeto ResultSet
                ator = new Atuacao();
                ator.setPapel(rs.getString("papel"));
                ator.setCod_atuacao(rs.getInt("cod_atua"));
                
                atuacoes.add(ator);
            }
                stmt.close();   //não podemos esquecer de liberar este recurso
                rs.close();     //não podemos esquecer de liberar este recurso
                return atuacoes; //retorna o arrayList
        } catch (SQLException ex) { //se a conexão falhar, emite a mensagem abaixo
            System.out.println("SQLException em consultar!!!" + "Erro detectado: " + ex.getMessage());
            return null;

            //como utiliza try-with-resource o recurso stmt é fechado automaticamente
        }
         
    }
    
    /**
     * <p>Este método realiza a operação de SELECT no banco de dados e gera uma listagem com todos os contados cadastrados.</p>
     * @param tbConsultar 
     */
    public ArrayList<Atuacao> listar(){
       
        String sql = "SELECT * FROM atua ORDER BY papel";
        
        ArrayList<Atuacao> atuacoes = new ArrayList<>(); //constrói um objeto da classe ArrayList, um array automaticamente dimensionável em tempo de execução
        Atuacao atuacao= new Atuacao(); //declara uma variável para receber um objeto da classe Contato
        
        try
            (Statement stmt = this.conn.createStatement(); //utilizamos um objeto Statement para realizar a operação
             ResultSet rs = stmt.executeQuery(sql);) //executamos o método executeQuery do objeto PreparedStatement no banco de dados e
                                                     //ele nos retorna um objeto ResultSet, com todos os dados retornados da consulta.
        {
            while (rs.next()) { //move o cursor para a próxima linha do ResultSet, varrendo todo o objeto ResultSet
                atuacao = new Atuacao(); //esvazia o objeto contato
                atuacao.setPapel("papel");
                atuacoes.add(atuacao); //insere um contato no arrayList
            }
                stmt.close();   //não podemos esquecer de liberar este recurso
                rs.close();     //não podemos esquecer de liberar este recurso
                return atuacoes; //retorna o arrayList
        } catch (SQLException ex) { //se a conexão falhar, emite a mensagem abaixo
            System.out.println("SQLException em consultar!!!" + "Erro detectado: " + ex.getMessage());
            return null;

            //como utiliza try-with-resource o recurso stmt é fechado automaticamente
        }
    }
    
    public Ator consultar2(long cod_ator, Ator at) throws SQLException{
        
        String sql = "SELECT * FROM ator WHERE cod_ator = " + cod_ator;  //aqui estamos criando uma String com o comando SQL.
      
        try
            (Statement stmt = this.conn.createStatement(); //utilizamos um objeto Statement para realizar a operação
             ResultSet rs = stmt.executeQuery(sql);) //executamos o método executeQuery do objeto PreparedStatement no banco de dados e
                                                     //ele nos retorna um objeto ResultSet, com todos os dados retornados da consulta.
        {
            
            rs.next();
               at.setNome_ator(rs.getString("nom_ator")); //insere os valores do resultSet
        
               stmt.close();   //não podemos esquecer de liberar este recurso
                rs.close();     //não podemos esquecer de liberar este recurso
                return at; //retorna o arrayList
        } catch (SQLException ex) { //se a conexão falhar, emite a mensagem abaixo
            System.out.println("SQLException em consultar!!!" + "Erro detectado: " + ex.getMessage());
         return null;
        }
    
    }
       

        
    
}